﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using OpenLab.BLL;
using OpenLab.UI.Helper;

namespace OpenLab.UI.Parametrage
{
    public partial class Medecin : Form
    {


        /*declaration**************************************************/
        readonly MedecinBLL _repository = new MedecinBLL();//moteur de methode
        private Model.Medecin _medecin = new Model.Medecin();//objet principale

        private List<Model.Medecin> _medecins = new List<Model.Medecin>();//liste d'objets

        readonly BindingSource _bs = new BindingSource();//binding source liste
        /**************************************************************/







        /*constructeur*************************************************/
        public Medecin()
        {
            InitializeComponent();
            InitializeForm();//initialiser le formulaire
        }
        /**************************************************************/


        /*initialisation avant chargement de deonne*********************/
        void InitializeForm()
        {
            InitializeDataList(); //init grid (choisir les option de selection et mise a jour)

            LoadData(); //charger les donnees

            MiseEnFormeGrid(); //mettre en forme le grid de donnees

            //ajouter les evennements sur les boutons
            okbtn.Click += okbtn_Click;
            filtertxt.TextChanged += filtertxt_TextChanged;

            //methode anonyme sur ajoutbtn (pour demo)
            ajoutbtn.Click += delegate { ClearData(); };
            cancelbtn.Click += delegate { ClearData(); };

            //set role sur botons
            exitbtn.DialogResult = DialogResult.Cancel;//informer windows que exitbtn est un bouton pour quiter form
        }


        void InitializeDataList()
        {
            medecindgv.ReadOnly = true; //disable edit
            medecindgv.AllowUserToAddRows = false; //disable add new row
            medecindgv.AllowUserToDeleteRows = true; //enable delete row

            medecindgv.UserDeletingRow += medecindgv_UserDeletingRow; //add delete event
            medecindgv.CellContentClick += medecindgv_CellContentClick; //add click element event
        }
        /**************************************************************/


        /*evenement sur les controles utilisateur**********************/
        void filtertxt_TextChanged(object sender, EventArgs e)
        {
            // ReSharper disable once PossibleNullReferenceException
            _bs.Filter = String.Format(" nom LIKE '%{0}%' or tel1 LIKE '%{0}%' or tel2 LIKE '%{0}%'", (sender as TextBox).Text);
        }

        void medecindgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            //si CurrentRow == null => ne rien faire
            if (medecindgv.CurrentRow == null) return;

            //obtenir id de l'element delectionne
            int selectedId = Convert.ToInt32(medecindgv.CurrentRow.Cells["id"].Value);

            //obtenir instance de l'element selectionne
            _medecin = _medecins.SingleOrDefault(x => x.id == selectedId);

            //bind l'element dans l'interface
            BindMedecin();
        }

        void medecindgv_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            //message de supression
            var dr = MessageBox.Show("الرجاء تأكيد الحذف", Text, MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
            e.Cancel = true;//annuler la supression de la ligne
            //si l'action de supression est annule
            if (dr == DialogResult.Cancel)
            {
                return;
            }
            //supprimer l'element selectionne
            _repository.DeleteById(_medecin.id);

            //vider le champs de saisi
            ClearData();

            //recharger les donnnes
            LoadData();
        }

        void okbtn_Click(object sender, EventArgs e)
        {
            //alimenter l'objet germe
            GetMedecin();

            //verifie si les donnees ne sont pas vide (Trim() pour supprimer les espace au debut et a la fin)
            if (_medecin.nom == "" || _medecin.tel1.Trim() == "" || _medecin.tel2.Trim() == "") return;

            //inserrer ou modifier les donnes
            if (_medecin.id > 0)
                _repository.Update(_medecin);
            else
                _repository.Add(_medecin);

            //vider les champs de saisie
            ClearData();

            //recharger les donnes
            LoadData();
        }
        /**************************************************************/


        /*methode pour lier les donnees avec le form*******************/
        void BindMedecin()
        {
            //charger l'objet germe dans les champs de saisie
            nomtxt.Text = _medecin.nom;
            tel1txt.Text = _medecin.tel1;
            tel2txt.Text = _medecin.tel2;
        }

        void GetMedecin()
        {
            //charger les champ de saisie dans l'objet germe
            _medecin.nom = nomtxt.Text;
            _medecin.tel1 = tel1txt.Text;
            _medecin.tel2 = tel2txt.Text;
        }
        /**************************************************************/


        /*methode de chargement et mise en form  des donnees************/
        void LoadData()
        {
            //chargement des donnees
            _medecins = _repository.GetAll().ToList();
            _bs.DataSource = Utile.ListToDatatable(_medecins);//convertir la liste en datatable pour le filtrage
            medecindgv.DataSource = _bs;
        }

        void MiseEnFormeGrid()
        {
            // ReSharper disable PossibleNullReferenceException
            medecindgv.Columns["id"].Visible = medecindgv.Columns["id"].Visible = false; //cacher la column id et Resultats

            //resize columns
            medecindgv.Columns["nom"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; //afficher les text
            medecindgv.Columns["tel1"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;// prendre l'espace restant de l'interface
            medecindgv.Columns["tel2"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;// prendre l'espace restant de l'interface

            //changer les nom des columns
            medecindgv.Columns["nom"].HeaderText = "الإسم";
            medecindgv.Columns["tel1"].HeaderText = "الهاتف القار";
            medecindgv.Columns["tel2"].HeaderText = "الهاتف الجوال";
        }
        /**************************************************************/


        /*vider les donnees*********************************************/
        void ClearData()
        {
            //vider les champs
            nomtxt.Text = nomtxt.Text = "";
            tel2txt.Text = tel2txt.Text = "";
            tel1txt.Text = tel1txt.Text = "";
            nomtxt.Focus();
            _medecin = new Model.Medecin();
        }




        /**************************************************************/
    }
}
